<?php

defined('EN_CODE') or die(__FILE__.': Direct Access Denied');
define('BUNDLE', 'ventas');
define('KEY', CSRF_TOKEN);

// instanciar el paginador con la cantidad de items por pagina
use Code\Paginador;
$paginador = new Paginador(25);
// traer el modelo del modulo
$helper->include_model('ventas');

$title = "Ventas";
$slug = "ventas";

$listado = false;
if (isset($parameters[2])) switch ($parameters[2]) {

  case 'detalle':
    /**
      
      detalle

    */
    if (!$request->query->has('venta')) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ninguna venta'));
      $response->setStatusCode(412);
    } else {
      $venta = una_venta($request->query->get('venta'));
      if (!$venta) {
        $content = $helper->include_template('error/server_error', array('message'=>'La venta seleccionada no existe'));
        $response->setStatusCode(412);
      } else {
        $helper->include_model('productos');
        $productos = productos_de_venta($venta['numero_venta']);
        if (!$productos) {
          $content = $helper->include_template('error/server_error', array('message'=>'La venta seleccionada no tiene productos!!'));
          $response->setStatusCode(412);
        } else {
          $content .= $helper->include_template(BUNDLE.'/detalle', array('venta'=>$venta, 'listado_productos'=>$productos));
        }
      }
    }
    break;

    /**

      comprobante

    */
  case 'comprobante':
    $venta = una_venta($request->query->get('venta'));
    if ($venta) {
      $helper->include_model('productos');
      $productos = productos_de_venta($venta['numero_venta']);
      if ($productos) {
        $comprobante = $helper->include_template(BUNDLE.'/comprobante', array('venta'=>$venta, 'listado_productos'=>$productos));
        $response->setContent($comprobante);
        $response->send();
        exit();
      }
    }
    $listado = true;
    break;

    /**
      
      procesar formulario

    */
  case 'guardar':
    $action = ($request->request->get('action'));
    $key = ($request->request->get('key'));
    $formulario = false; // para saber si hay que cargar nuevamente el formulario (similar a $listado)
    $guardar = true;
    if (is_null($action) || is_null($key)) {
      $listado = true;
      break(1);
    }
    if ($request->request->get('key')!=(SHA1($request->request->get('action').CSRF_TOKEN))) {
      $content = $helper->include_template('error/server_error', array('message'=>'Se detectó un ataque CSRF!! Dejá de joder y leete un libro...'));
      break(2);
    }
    /**
    se fija que tenga todos los datos
    */
    $dni_cliente = $request->request->getDigits('dni_cliente');
    if (empty($dni_cliente)) {
      $message = 'Envió un DNI vacío!!';
      $message_type = 'error';
      $formulario = true;
    } else {
      $helper->include_model('clientes');
      $cliente = un_cliente_con(array('dni'=>$dni_cliente));
      if (!$cliente) {
        $message = 'No existe un cliente con ese DNI!!';
        $message_type = 'error';
        $formulario = true;
      } else {
        $productos = $request->request->getDigits('productos');
        if (empty($productos)) {
          $message = 'No se seleccionaron productos para la venta!!';
          $message_type = 'error';
          $formulario = true;
        } else {
          // se fija que todos los productos tengan stock suficiente
          $helper->include_model('productos');
          foreach ($productos as $id_producto => $cantidad) {
            $producto = un_producto($id_producto);
            if (($producto['stock'] - $cantidad)<0) {
              $guardar = false;
              $message = "El producto $producto[nombre] no cuenta con suficiente stock ($producto[stock])";
              $message_type = "error";
              $formulario = true;
            }
          }
          if ($guardar) {
            $monto = monto_total($productos);
            descontar_stock($productos);
            $numero_venta = crear_venta(array(
                'forma_pago' => $request->request->getDigits('forma_pago'),
                'numero_cliente' => $cliente['numero_cliente'],
                'id_empleado' => $request->request->getDigits('id_empleado'),
                'monto' => $monto
              ), $productos
            );
            if ($numero_venta) {
              $message = "Se creó la venta con número $numero_venta";
              $message_type = 'info';
            } else {
              $message = "No se pudo crear la venta";
              $message_type = 'error';
            }
            $listado = true;
            $popup = $numero_venta;
          }
        }
      }
    }
    if (!$formulario) {
      break(1); // <-- para que cargue nuevamente el formulario
    }
   
  case 'nuevo':
    /**
      
      nuevo

    */
    $helper->include_model('productos');
    $productos = listado_total_productos_con_stock();
    $helper->include_model('clientes');
    $clientes = listado_clientes();
    if (empty($productos) || empty($clientes)) {
      $content = $helper->include_template('error/server_error', array('message'=>'Para cargar una venta se requiere que haya Productos con stock y Clientes'));
      $response->setStatusCode(412);
    } else {
      $formas_pago = formas_pago();
      $content .= $helper->include_template(BUNDLE.'/formulario', array('action'=>'new', 'key'=>SHA1('new'.CSRF_TOKEN), 'productos'=>$productos, 'formas_pago'=>$formas_pago, 'clientes'=>$clientes));
    }
    break;
    /**

      eliminar

    */
  case 'eliminar':
    if (!$request->query->has('venta')) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ninguna venta'));
      $response->setStatusCode(412);
      break(1);
    }
    if ((!$request->query->has('token')) || ($request->query->get('token')!=(SHA1($request->query->get('venta').CSRF_TOKEN)))) {
      $content = $helper->include_template('error/server_error', array('message'=>'Se detectó un ataque CSRF!! Dejá de joder y leete un libro...'));
      break(1);
    }
    $venta = una_venta($request->query->get('venta'));
    if ($venta && ($venta['estado']==1)) {
      $helper->include_model('productos');
      $productos_venta = productos_de_venta($venta['numero_venta']);
      aumentar_stock($productos_venta);
      cancelar_venta($venta['numero_venta']);
      $message = "Se canceló la venta";
      $message_type = 'info';
    }
    $listado = true;
    $popup = $venta['numero_venta'];
    break;

    /**

      buscar

    */
  case 'buscar':
    $hay_consultas = false; // para saber si usar WHERE o AND en el armado de la consulta
    $filtros = array(); // para determinar los filtros que se van a aplicar en la consulta
    /**
      numero de venta
    */
    $query_numero_venta = '';
    if ($request->query->has('numero_venta')) {
      if (preg_match('/^\d+$/', $request->query->get('numero_venta'))) {
        $query_numero_venta = " WHERE numero_venta=". $request->query->get('numero_venta') ." ";
        $hay_consultas = true;
        $filtros['número de venta='] = $request->query->get('numero_venta');
      }
    }
    /**
      monto
    */
    $query_monto_desde = '';
    if ($request->query->has('monto_desde')) {
      if (preg_match('/^\d+(\.\d{1,2})?$/', $request->query->get('monto_desde'))) {
        $join = ($hay_consultas ? "AND" : "WHERE");
        $query_monto_desde = " $join monto>=". $request->query->get('monto_desde') ." ";
        $hay_consultas = true;
        $filtros['monto mayor a '] = $request->query->get('monto_desde');
      }
    }
    $query_monto_hasta = '';
    if ($request->query->has('monto_hasta')) {
      if (preg_match('/^\d+(\.\d{1,2})?$/', $request->query->get('monto_hasta'))) {
        $join = ($hay_consultas ? "AND" : "WHERE");
        $query_monto_hasta = " $join monto<=". $request->query->get('monto_hasta') ." ";
        $hay_consultas = true;
        $filtros['monto menor a '] = $request->query->get('monto_hasta');
      }
    }
    /**
      fecha
    */
    $query_fecha_desde = '';
    if ($request->query->has('fecha_desde')) {
      if (preg_match('/^(\d{4})\-(\d{2})\-(\d{2})$/', $request->query->get('fecha_desde'))) {
        $join = ($hay_consultas ? "AND" : "WHERE");
        $query_fecha_desde = " $join fecha>='". $request->query->get('fecha_desde') ." 00:00:00' ";
        $hay_consultas = true;
        $filtros['fecha mayor a '] = $request->query->get('fecha_desde');
      }
    }
    $query_fecha_hasta = '';
    if ($request->query->has('fecha_hasta')) {
      if (preg_match('/^(\d{4})\-(\d{2})\-(\d{2})$/', $request->query->get('fecha_hasta'))) {
        $join = ($hay_consultas ? "AND" : "WHERE");
        $query_fecha_hasta = " $join fecha<='". $request->query->get('fecha_hasta') ." 23:59:59' ";
        $hay_consultas = true;
        $filtros['fecha menor a '] = $request->query->get('fecha_hasta');
      }
    }
    /**
      cliente
    */
    $query_cliente = '';
    if ($request->query->has('cliente')) {
      $cliente = trim($request->query->get('cliente'));
      if ($cliente!='') {
        $join = ($hay_consultas ? "AND" : "WHERE");
        foreach (explode(' ', $request->query->get('cliente')) as $filtro_cliente) {
          $filtro_cliente = trim($filtro_cliente);
          if ($filtro_cliente!='') {
            $query_cliente .= " $join (c.nombre LIKE '%$filtro_cliente%' OR c.apellido LIKE '%$filtro_cliente%') ";
          }
          $join = "AND";
        }
        $hay_consultas = true;
        $filtros['cliente similar a '] = $request->query->get('cliente');
      }
    }
    /**
      armar la consulta y traer el listado
    */
    $listado = true;
    // se fija el orden
    $order_by = '';
    if ($request->query->has('orden_c')) {
      $order_by = " ORDER BY ". $request->query->get('orden_c') ." ";
      if ($request->query->has('orden_t')) {
        $order_by .= " ". $request->query->get('orden_t') ." ";
      }
    }
    $query = "SELECT v.*, CONCAT_WS(' ', c.nombre, c.apellido) AS cliente FROM ventas v INNER JOIN clientes c USING(numero_cliente)
              $query_numero_venta $query_monto_desde $query_monto_hasta $query_fecha_desde $query_fecha_hasta $query_cliente $order_by";
    $query = $paginador->query($query, $request->query->get('pagina', 1));
    $result = $model->query($query);
    if (!$result || $model->numRows($result)==0) {
      $message = 'La búsqueda no produjo ningún resultado';
      $message_type = 'error';
    } else {
      $filtrado = "Filtrando por ";
      $i = 0; // para saber si separa con coma
      foreach ($filtros as $filtro => $valor) {
        $filtrado .= "$filtro'$valor'";
        $filtrado .= ((++$i==count($filtros)) ?'': ", " );
      }
      $listado_ventas = $model->fetchAll($result);
    }
    break;

  default:
    $listado = true;
} else {
  $listado = true;
}

/**
  
  listado

*/

// listado esta aca por ser la pagina por default
if ($listado) {

	// va a buscar el listado de ventas
	if (!isset($listado_ventas)) {
    // se fija el orden
    $order_by = '';
    if ($request->query->has('orden_c')) {
      $order_by = " ORDER BY ". $request->query->get('orden_c') ." ";
      if ($request->query->has('orden_t')) {
        $order_by .= " ". $request->query->get('orden_t') ." ";
      }
    }
    $query = "SELECT v.*, CONCAT_WS(' ', c.nombre, c.apellido) AS cliente FROM ventas v INNER JOIN clientes c USING(numero_cliente) $order_by";
    $query = $paginador->query($query, $request->query->get('pagina', 1));
    $result = $model->query($query);
    $listado_ventas = $model->fetchAll($result);
  }

  // arma el array orden_t (asc o desc)
  $orden_t = $helper->get_order_links(array('monto', 'fecha', 'cliente'), $request->query->get('orden_c', null), $request->query->get('orden_t', null));
  // arma la URI para el paginador
  $uri_paginador = $helper->build_uri(array('pagina'));
  // arma la URI para el orden
  $uri_orden = $helper->build_uri(array('orden_c', 'orden_t'));

  // muestra el template
  $content .= $helper->include_template(BUNDLE.'/listado',
                                        array(
                                          'ventas'=>$listado_ventas,
                                          'uri_orden'=>$uri_orden,
                                          'orden_t'=>$orden_t,
                                          'uri_paginador'=>$uri_paginador,
                                          'paginador'=>$paginador,
                                          'popup'=>(isset($popup) ? $popup : null),
                                          'filtrado'=>(isset($filtrado) ? $filtrado : ''),
                                          'user_agent'=>$request->headers->get('user-agent')));
}

?>
